package sicnu.cs.ich.security.service;


import sicnu.cs.ich.api.common.ResultInfo;
import sicnu.cs.ich.api.domain.entity.UserInfo;
import sicnu.cs.ich.api.domain.form.UserForm;
import sicnu.cs.ich.api.domain.form.WechatUserForm;
import sicnu.cs.ich.security.domain.entity.User;
import sicnu.cs.ich.security.exceptions.exception.WechatLoginException;

public interface IUserService {

    /**
     * 用户名是否存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean isUsernameExisted(String username);

    /**
     * 邮箱是否存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean isEmailExisted(String email);

    /**
     * 手机号是否存在
     *
     * @param mobile 手机号
     * @return 是否存在
     */
    boolean isMobileExisted(String mobile);

    /**
     * 该用户id是否存在
     *
     * @param id 用户id
     * @return 是否存在
     */
    boolean isUserIdExisted(Integer id);

    /**
     * 注册用户
     *
     * @param user 需要注册的用户对象
     */
    void register(UserForm user);

    /**
     * 重置用户密码
     *
     * @param password 新密码
     * @param id       用户id
     */
    boolean resetPassword(Integer id, String password);

    /**
     * 处理用户的注册请求
     *
     * @param user 用户表单
     * @return 处理信息
     */
    ResultInfo<Void> handleRegister(UserForm user);

    /**
     * 查找用户
     *
     * @param email 邮箱地址
     * @return 用户
     */
    User findUserByEmail(String email);

    /**
     * 查找用户
     *
     * @param userId 主键
     * @return 用户
     */
    User findUser(Integer userId);

    /**
     * @param userId 用户id
     * @param email  新邮箱
     * @return 是否修改成功
     */
    boolean updateEmail(Integer userId, String email);

    /**
     * 根据用户id查找密码
     *
     * @param userId 用户id
     * @return 密码
     */
    String findPassword(Integer userId);

    /**
     * 根据用户id查找用户信息
     *
     * @param userId 用户id
     * @return 用户信息
     */
    UserInfo findUserInfo(Integer userId);

    /**
     * 更新用户信息
     *
     * @param userInfo 用户信息
     */
    boolean updateUserInfo(UserInfo userInfo);

    /**
     * 更新用户信息
     */
    boolean updateUser(User user);

    /**
     * 根据授权的用户信息直接创建用户
     */
    User registerWechatUser(WechatUserForm userForm) throws WechatLoginException;
}
